package company;

import java.util.Scanner;

/**
 * 541. 反转字符串 II
 * 给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。
 * <p>
 * 如果剩余字符少于 k 个，则将剩余字符全部反转。
 * 如果剩余字符小于 2k 但大于或等于 k 个，
 * 则反转前 k 个字符，其余字符保持原样。
 *  
 * <p>
 * 示例 1：
 * <p>
 * 输入：s = "abcdefg", k = 2
 * 输出："bacdfeg"
 * 示例 2：
 * <p>
 * 输入：s = "abcd", k = 2
 * 输出："bacd"
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/reverse-string-ii
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class ReverseStr541 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] input = sc.nextLine().split("\\s+");
        String s = input[0].replace("\\s+", "");
        String k = input[1].replace("\\s+", "");
        String s1 = reverseStr(s, Integer.parseInt(k));
        System.out.println(s1);
    }

    public static String reverseStr(String s, int k) {
        int len = s.length();
        int port = 0;
        int reverseLen = k;
        while (port < len) {
            int cnt = len - port;
            StringBuffer sb = new StringBuffer();
            // 注意到翻转长度，是k或者是小于k的cnt
            if (cnt < k) {
                reverseLen = cnt;
            }

            // 字符串组成有三部分，前面，中间，后面，要算出翻转的起点和结束点
            s = s.substring(0, port) +
                    sb.append(s.substring(port, port + reverseLen)).reverse() +
                    s.substring(port + reverseLen, len);

            // 更新下一次开始位置
            if (cnt >= 2 * k) {
                port += 2 * reverseLen;
            } else{
                port += cnt;
            }
        }
        return s;
    }
}
